Configuration (part 3 – Registry)
In part 3 we’re again looking at how to use the API to write some code, this time for the registry solution.
Registry
The NA_RegistryService
interface provides the registry functionality, and we’ll also be examining use of NA_Commanding
to tell our targets to reload their configuration from the registry. For our example, we’ll use a serial channel and we’ll configure the following items,
- Rx Baud rate
- Sync pattern
- Frame length
First let’s talk about the registry keys that we need to know. We’ll be working on channel zero 0
, so the base registry path for all these will be /netacq/server/device/sio/0/0
.
- Rx Baud rate
- ibaudrat – floating point baud rate
- Sync pattern
- syncpat – space delimited, e.g., “FA F3 20”
- synclen – count, in bits, of the sync length
- Frame length
- iminlen – (bits) minimum frame length, sync with max (else means variable length)
- imaxlen – (bits) maximum frame length
- bufsize – (bytes) match to imaxlen, byte-integral
Commanding
Once we’ve set the key(s), we’ll need to command the channel to Reload so it re-reads the registry and picks up the new configuration.
UNC paths
The commanding object typically follows a path pattern similar to the registry area where the configuration is found, minus the prefix of /netacq/server
.
// data flow 0
server.GetCommanding("/device/dfe/0");
// serial channel 5
server.GetCommanding("/device/sio/0/5");
// recorder 3
server.GetCommanding("/dispatch/p_recorder/3");
Commanding nuances
Committing and commanding an entity differs slightly depending on what the entity does. Think of entities as they fall into one of two categories: “playable” types and those that just operate.
Playable entities
Subsystems that are controllable with notions of stop/start need to be stopped and started again. These entities include (non-exhaustive list),
- Recorder
- Player
- BERT
- SIOGEN
However, Data Flow is not included in this type.
Other entities
Other entities such as serial, data flow, etc., can simply be reloaded via “Reload” command to force a re-read of the registry and reconfiguration.
// serial channel 5
NA_Commanding ch5 = server.GetCommanding("/device/sio/0/5");
ch5.CommandEntity("Reload");
Putting it all together
Let’s look at some examples.
Serial channel configuration
Here’s our before:
string ch0 = "/netacq/server/device/sio/0/0/";
NA_RegistryService registry = server.GetRegistry();
registry.SetString(ch0 + "ibaudrat", "2000000");
registry.SetString(ch0 + "syncpat", "d2b3c6a1");
registry.SetString(ch0 + "synclen ", "32");
registry.SetString(ch0 + "iminlen", "4096");
registry.SetString(ch0 + "imaxlen", "4096");
registry.SetString(ch0 + "bufsize", "512");
// or using batch - 1 write operation
KeyValuePair[] keys = {
new KeyValuePair(ch0 + "ibaudrat", "2000000"),
new KeyValuePair(ch0 + "syncpat", "d2 b3 c6 a1"),
new KeyValuePair(ch0 + "synclen ", "32"),
new KeyValuePair(ch0 + "iminlen", "4096"),
new KeyValuePair(ch0 + "imaxlen", "4096"),
new KeyValuePair(ch0 + "bufsize", "512"),
};
// (keys, atomic_operation, create_if_missing, abort_if_exists)
registry.WriteKeys(keys, true, true, false);
// then reload the channel to complete
NA_Commanding ch0Cmd = server.GetCommanding("/device/sio/0/0");
ch0Cmd.CommandEntity("Reload");
And our after:
Recorder configuration
Let’s try a recorder example. We’ll start with a new, empty recorder instance.
string recorder0 = "/netacq/server/dispatch/p_recorder/0/";
NA_RegistryService registry = server.GetRegistry();
registry.SetString(recorder0 + "recordingname", "example");
// raw binary recording
registry.SetString(recorder0 + "recordingformat", "1");
// channel definitions
// (versions 9.0.7 and earlier): [channel#, UNC, type]
registry.SetString(recorder0 + "streams", "1 sio/0/in0 Throughput");
// (versions 9.0.8 and higher): JSON format - no time channel for RAW format
// registry key for 9.0.8+ is now "channels" - contact tech support for full details
// {"data":[{"id":1,"input":"sio/0/in0","format":"PCM-Throughput"}],"time":[]}
// or using batch - 1 write operation (
KeyValuePair[] keys = {
new KeyValuePair(recorder0 + "streams", "1 sio/0/in0 Throughput"),
new KeyValuePair(recorder0 + "recordingname", "example"),
new KeyValuePair(recorder0 + "recordingformat", "1")
};
// (keys, atomic_operation, create_if_missing, abort_if_exists)
registry.WriteKeys(keys, true, true, false);
NA_Commanding recorder0Cmd = server.GetCommanding("dispatch/p_recorder/0");
// NOTE: some entities enforce states, we'll assume it's running for simplicity
recorder0Cmd.CommandEntity("Stop");
recorder0Cmd.CommandEntity("Start");
And our after: